<?php
namespace Zxf5115\Laravel\Local\Upload\Services;

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Zxf5115\Laravel\Local\Upload\Utils\FileUtil;
use Zxf5115\Laravel\Local\Upload\Rules\FileRule;
use Zxf5115\Laravel\Resource\Services\ResourceService;


/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * 资源上传服务类
 */
class FileService
{
  /**
   * 上传文件
   *
   * @param UploadedFile $file 上传文件对象
   * @param string $path 路径
   * @param array $allowTypes 允许上传类型
   * @param bool $isFilename 是否返回文件名
   * @return string|array 上传结果
   */
  public function file(UploadedFile $file, string $path, array $allowTypes, bool $isFilename) : string|array
  {
    // 上传资源文件内容验证方法
    FileRule::verifyFileData($file, $allowTypes);

    $hash = FileUtil::getFileHash($file->getRealPath());

    // 根据哈希验证资源信息是否存在
    $result = ResourceService::verifyFileUploadCompleted($hash, $isFilename);

    if(!is_null($result))
    {
      return $result;
    }

    // 设置文件上传目录
    $dir = FileUtil::setFileDir($path);

    // 获取待保存文件名称方法
    $filename = FileUtil::getFileName($file);

    // 保存文件
    if($url = Storage::disk('public')->putFileAs($dir, $file, $filename))
    {
      // 存储上传文件信息
      $this->setFileUploadCompleted($file, $url);

      // 获取上传文件响应内容
      return FileUtil::getResourceData($file, $url, $isFilename);
    }
    else
    {
      return error(__('upload.upload_failed'));
    }
  }


  /**
   * 批量上传文件
   *
   * @param UploadedFile $files 上传文件对象
   * @param string $path 路径
   * @param array $allowTypes 允许上传类型
   * @param bool $isFilename 是否返回文件名
   * @return string|array 上传结果
   */
  public function batchRichTextFile(UploadedFile $files, string $path, array $allowTypes, bool $isFilename) : string|array
  {
    $response = [];

    // 上传资源文件是否为空验证
    FileRule::verifyFileExists($files);

    // 批量上传
    foreach($files as $k => $file)
    {
      // 上传资源文件内容验证方法
      FileRule::verifyFileData($file, $allowTypes);

      $hash = FileUtil::getFileHash($file->getRealPath());

      // 根据哈希验证资源信息是否存在
      $result = ResourceService::verifyFileUploadCompleted($hash, $isFilename);

      if(!is_null($result))
      {
        $response[$k] = $result;

        continue;
      }

      // 设置文件上传目录
      $dir = FileUtil::setFileDir($path);

      // 获取待保存文件名称方法
      $filename = FileUtil::getFileName($file);

      // 保存文件
      if($url = Storage::disk('public')->putFileAs($dir, $file, $filename))
      {
        // 存储上传文件信息
        $this->setFileUploadCompleted($file, $url);

        // 获取上传文件响应内容
        $response[$k] = FileUtil::getResourceData($file, $url, $isFilename);
      }
    }

    return $response;
  }


  /**
   * 存储上传文件信息
   *
   * @param UploadedFile $file 上传文件对象
   * @param string $url 上传文件地址
   * @return void
   */
  private static function setFileUploadCompleted(UploadedFile $file, string $url) : void
  {
    $params = [
      'name' => $file->getClientOriginalName(),
      'size' => $file->getSize(),
      'mimetype' => $file->getMimeType(),
      'extension' => strtolower($file->getClientOriginalExtension()),
      'hash' => FileUtil::getFileHash($file->getRealPath()),
      'url' => FileUtil::getCompleteUrl($url)
    ];

    // 保存平台文件信息
    ResourceService::setFileUploadCompleted($params);
  }
}
